/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.mindbox.mueblesalpes.negocio.compras;

import com.mindbox.mueblesalpes.negocio.entity.CategoriaValor;
import com.mindbox.mueblesalpes.negocio.entity.Cliente;
import com.mindbox.mueblesalpes.negocio.entity.Compra;
import com.mindbox.mueblesalpes.negocio.entity.Entidad;
import com.mindbox.mueblesalpes.negocio.entity.Mueble;
import com.mindbox.mueblesalpes.negocio.entity.MuebleInventario;
import com.mindbox.mueblesalpes.negocio.entity.Usuario;
import com.mindbox.mueblesalpes.negocio.entity.Venta;
import java.util.List;

/**
 *
 * @author Catalina
 */
public interface ICompras {

    /**
     * Obtiene los productos que están aptos para la venta.
     * @return
     */
    public List<Mueble> obtenerProductosParaLaVenta();

    /**
     * Obtiene el precio y el inventario actual del mueble
     * @param mueble
     * @return
     */
    public MuebleInventario obtenerPrecioInventarioMueble(Mueble mueble);

    /**
     * Calcular el subtotal de las compras.
     * @param carritoCompras
     * @return
     */
    public double calcularSubtotalCompra(List<Compra> carritoCompras);

    /**
     * Calcula el valor por cada categoria que se le va a cobrar al cliente.
     * @param carritoCompras
     * @return
     */
    public List<CategoriaValor> calcularValorCategoriasCompra(List<Compra> carritoCompras);

    /**
     * Calcula el valor total de la compra dados la categorías que se le va a cobrar al cliente.
     * @param categoriasValor
     * @return
     */
    public double calcularValorTotalCompra(List<CategoriaValor> categoriasValor);

    /**
     * Realiza la venta de unos productos.
     * @param catergoriasValor
     * @param cliente
     * @param usuario
     * @param carritoCompras
     * @param valorTotal
     * @return
     */
    public Venta realizarVenta(List<CategoriaValor> catergoriasValor, Cliente cliente,
            Usuario usuario, List<Compra> carritoCompras, double valorTotal);

    /**
     * Obtiene la descripción de la venta.
     * @param venta
     * @return
     */
    public String getDescripcionVenta(Venta venta);

    /**
     * Obtiene las entidades bancarias.
     * @return
     */
    public List<Entidad> getEntidadesBancarias();

    /**
     * Obtiene las entidades "tarjeta de credito".
     * @return
     */
    public List<Entidad> getEntidadesTarjetaCredito();

    /**
     * Cancela una venta.
     * 
     * @param venta
     * @return
     */
    public Venta cancelarPago(Venta venta);

    /**
     * Realiza el pago.
     * @param venta
     */
    public void realizarPago(Venta venta);
}
